perm filename EMAIN4.2[EAL,HE]1 blob
sn#674829 filedate 1982-09-27 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 {$NOMAIN Editor: Statement executor for immediate mode }
C00006 00003 procedure eDoStmnt external
C00010 ENDMK
C⊗;
{$NOMAIN Editor: Statement executor for immediate mode }
%include emain.hdr;
{ Externally defined routines from elsewhere: }
(* From ALLOC *)
procedure relStatement(n: statementp); external;
(* From CALLER *)
procedure emAddStmnt(firstTime: boolean; which: integer); external;
function em4StmntParse(var cblk,newDecs: statementp;
cproc: varidefp): statementp; external;
(* From ETOKEN *)
procedure eGetToken; external;
(* From PAUX2 *)
procedure relExpr(n: nodep); external;
(* From EEXPAR *)
function eExprParse: nodep; external;
(* From EPAR3C *)
function declarationp: boolean; external;
(* From EPAR3D *)
function addNewDeclarations: integer; external;
(* From EAUX3B *)
procedure collectStmnt(s: statementp); external;
(* From EDEBUG *)
procedure executeStmnt(st: statementp; which: integer); external;
procedure pevalExpr(n: nodep; which: integer); external;
(* From PP *)
function getLine(length: integer): linerecp; external;
procedure relLine(l: linerecp); external;
procedure ppLine; external;
procedure ppOutNow; external;
procedure ppChar(ch: ascii); external;
procedure pp5(ch: c5str; length: integer); external;
procedure pp10(ch: cstring; length: integer); external;
procedure pp10L(ch: cstring; length: integer); external;
procedure pp20(ch: c20str; length: integer); external;
procedure pp20L(ch: c20str; length: integer); external;
procedure ppInt(i: integer); external;
procedure ppReal(r: real); external;
procedure ppStrng(length: integer; s: strngp); external;
procedure ppDtype(d: datatypes); external;
procedure ppDelChar; external;
(* From DISP *)
procedure showCursor(line,col: integer); external;
procedure em4Get; external;
procedure em4Get; begin end;
procedure eDoStmnt; external;
procedure eDoStmnt;
var s,sp: statementp; b: boolean; n: nodep;
i: integer;
begin
with eCurToken do
begin
eBackup := true;
newVarOk := false; (* don't accept undefined variables *)
n := eExprParse; (* see what we're to evaluate *)
eGetToken; (* & check if it's followed by an ":=" *)
newVarOk := true;
if newDeclarations <> nil then
begin
b := false;
s := newDeclarations;
newDeclarations := nil;
repeat
s↑.variables↑.vtype := freevartype;
s↑.variables↑.name := nil;
sp := s;
s := s↑.last;
relStatement(sp);
until s↑.stype = blocktype;
end
else b := true;
if (ttype = reswdtype) and (rtype = stmnttype) and
(stmnt = assigntype) then
begin (* have parser parse it *)
relExpr(n); (* don't need this any more *)
i := cursor;
s := em4StmntParse(curBlock,newDeclarations,curProc);
showCursor(cursorLine-topDline-firstDline+2,1);
i := addNewDeclarations;
if s↑.stype = emptytype then relStatement(s)
else
begin
collectStmnt(s); (* if collecting add stmnt to prog *)
executeStmnt(s,4); (* go do it *)
end;
end
else if b then pevalExpr(n,4) (* eval & print out expr *)
else
begin
relExpr(n); (* flush bad expr *)
pp20('Undefined variable(s',20); pp20(') - bad expression ',18); ppLine;
end;
end
end;
procedure eDoOtherCmd; external;
procedure eDoOtherCmd;
var i: integer; s: statementp;
begin
with eCurToken do
begin
eBackup := true;
if declarationp then
begin
eBackup := true;
emAddStmnt(false,4); (* Use overlay caller *)
end
else
begin (* have parser parse it *)
i := cursor;
s := em4StmntParse(curBlock,newDeclarations,curProc);
showCursor(cursorLine-topDline-firstDline+2,1);
i := addNewDeclarations;
if s↑.stype = emptytype then relStatement(s)
else
begin
collectStmnt(s); (* if collecting add stmnt to prog *)
executeStmnt(s,4); (* go do it *)
end;
end
end
end;